package Thread;/*
 *
 *@author:    Xavier
 *@data:      2024 - 01 - 13
 *@time:      14:16
 *
 */


//单例模式（懒汉模式）- 不是线程安全的
// 主要是因为修改的操作不是原子的
// 解决方法 - 加锁
//线程不安全，主要是在首次new对象的时候，才存在的问题
// 一旦把对象new好了之后，后续在调用getInstance，都没有冲突了

class SingletonLazy {
    private static volatile SingletonLazy instance = null;
    //private static Object locker = new Object();

    public static SingletonLazy getInstance() {
        // instance 如果为null 首次调用，所以加锁
        if (instance == null) {
            //synchronized (locker) {} 这种和下面这种都可以
            synchronized (SingletonLazy.class) {
                if (instance == null) {
                    instance = new SingletonLazy();
                }

            }
        }
        return instance;
    }
    private SingletonLazy() {}
}

public class Demo17 {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();

        System.out.println(s1 == s2);
    }
}
